{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 16 entries, 0 to 15\n",
      "Data columns (total 4 columns):\n",
      "0    16 non-null float64\n",
      "1    16 non-null float64\n",
      "2    16 non-null int64\n",
      "3    16 non-null int64\n",
      "dtypes: float64(2), int64(2)\n",
      "memory usage: 592.0 bytes\n",
      "None\n",
      "     0    1  2  3\n",
      "0  1.0  4.0  0  0\n",
      "1  1.1  3.9  0  0\n",
      "2  1.2  4.1  0  0\n",
      "3  0.9  3.7  0  0\n",
      "4  7.0  4.0  0  1\n",
      "      0    1  2  3\n",
      "11  3.9  0.8  1  0\n",
      "12  4.0  7.0  1  1\n",
      "13  4.2  7.2  1  1\n",
      "14  3.9  7.1  1  1\n",
      "15  4.1  6.8  1  1\n"
     ]
    }
   ],
   "source": [
    "# 准备数据集\n",
    "data_path=\"E:\\PyProjects\\/DataSet\\/FireAI\\/data_single_layer.txt\"\n",
    "df=pd.read_csv(data_path,header=None,sep=' ')\n",
    "print(df.info()) # 查看数据信息，确保没有错误\n",
    "print(df.head())\n",
    "print(df.tail())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 该数据集的前两列是features，后两列是labels\n",
    "dataset_X=df.iloc[:,:2].values\n",
    "dataset_y=df.iloc[:,2:].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5,1,'dataset_X distribution')"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAEICAYAAAB/Dx7IAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAFPBJREFUeJzt3X+QXXV9xvHncbPIEqGrZrVkI6ZY3VbNlGXuIBqlNKABiTaTYoUWpjg66R+OBUujCdP6Y5RJaqYOWmccUxCp/BCFkD8oEJiJGSUVdPMDIyarRUOTDZAFWSGylhA+/eOeJTfLvXvP3ezdc79336+ZO3vvOeee8zk7ybPnfM73nuuIEAAgHa8ougAAQGMIbgBIDMENAIkhuAEgMQQ3ACSG4AaAxBDcAJAYgnsGs/0t218suo6iVO6/7ffYHpzCdd9t+++y55fZvn8K1/23tu+dqvUhPQQ3crG92fbHWmU7tufZftr2uyumvSGb9o5GtxsRP4yIvhzb/ZztG3Os7/yIuKHROqpsb77tsD2rYt03RcT7jnXdSBfBjSRFxD5Jn5Z0re3js8nfkHR9RDxYVF0u4/8Vmop/YDOI7X7b22w/a/tWScdXzHu17TttD2dHrXfanpfNu1rSeyR9zfZB21/Lpn/F9l7bz9jeavs9Fes7w/ZANu8J21+umHem7f+2PWL7IdtnT7SdCfyHpMckfTZrS/RJ+udJ7v/ZtvdVvP607aFs2UHb59g+T9JVkj6c1fdQtuxm21fb3iLpOUmnVjlzsO1/t/1b27ttn1MxY4/tcyteVx7V/yD7OZJt853jWy+232X7J9m6f2L7XRXzNtv+gu0t2b7ca3tOnd8rWl1E8JgBD0nHSXpU0icldUq6UNIhSV/M5r9W0l9JOkHSiZK+J2lDxfs3S/rYuHVekr1vlqQrJT0u6fhs3o8kXZo9f5WkM7PnvZKekvR+lQ8c3pu97qm1nTr79SZJv5X0tKRFx7D/Z0valz3vk7RX0tzs9XxJb8qef07SjePWvVnS/0p6W/a76KzcD0mXSXqhYtsfzmp+TTZ/j6RzK9b30jaybYekWRXzL5N0f/b8Ndm+X5pt++Ls9WsrantE0lskdWWv1xT975HHsT044p45zlQ5NK6JiEMRcZukn4zNjIinIuL2iHguIp6VdLWkP59ohRFxY/a+FyLi3yS9UuXQk8qh+Me250TEwYh4IJt+iaS7IuKuiHgxIu6TNKBykE/Go5L2S3pGR45Oq5lw/8c5nO3LW213RsSeiHikTh3fioiHs9/FoSrzD1Rs+1ZJg5IuqLPOPC6Q9MuI+Ha27Vsk7Zb0gYplro+IX0TEqKTvSjptCraLAhHcM8dcSUMRUXk7yEfHntg+wfY3bD9qeywEu2131Fqh7Stt78pO0Uck/YGksdPwj6p8lLc7O31fkk1/o6QPZW2Skex975Z08iT3a6XKR+wHJP3TBMtNuP+VIuJ/JF2h8pHvAdvfsT23Th1768yvtu1668xjrl6+H4+qfGYz5vGK58+pfAaEhBHcM8djknptu2LaKRXPr1T5aPkdEXGSpLOy6WPLH3X/36yf/WlJfy3p1RHRrfLpvyUpIn4ZERdLep2kf5V0m+3ZKgfctyOiu+IxOyLWVNvORGy/VdIKSR9T+Q/FVbbfPMn9P0pE3BwR71b5D01k+zBRffXqrrbt/dnz36ncohrzhw2sd39WY6VTJA3VeR8SRnDPHD9Suc/6D7Zn2V4m6YyK+SdKGlX5IthrJH123PufkHTquOVfkDQsaZbtz0g6aWym7Uts90TEi5JGssmHJd0o6QO2F9vusH18dmFwXo3tVJWN3LhO0pciYndE/FTSVyWtGxeQefe/ct19thfZfqWk32e/l8MV9c2fxMiR12Xb7rT9IUl/KumubN4OSRdl80oq99/HDEt6UbV/J3dJeovtv8n268OS3irpzgbrQ0II7hkiIp6XtEzlC1tPq3yBbH3FIteofPHqSUkPSLpn3Cq+IunCbMTJVyVtlHS3pF+ofGr+ex3dLjhP0sO2D2bvvSgifh8ReyX9pcqjM4az96zQkX+L47dTy+UqH6V+qWLaF1Q+Wn3ZOPAc+1/plZLWZL+Lx1UO3auyed/Lfj5le9sE9Y33oKQ3Z+u8WtKFEfFUNu9fVL7I+rSkz0u6uaLu57Llt2StpTPH7ddTkpaofMb0lKRPSVoSEU82UBsS46PbbgCAVscRNwAkZlb9RYBiZBdA7642LyIYGYEZi1YJACSmKUfcc+bMifnz5zdj1QDQlrZu3fpkRPTkWbYpwT1//nwNDAw0Y9UA0JZsV/1AWDVcnASAxBDcAJAYghsAEkNwA0BiCG4ASAzBDQCJ4ZOTmPE2bB/S2o2D2j8yqrndXVqxuE9L+3vrvxEoCMGNGW3D9iGtWr9To4fKd20dGhnVqvU7JYnwRsuiVYIZbe3GwZdCe8zoocNau3GwoIqA+jjiRtuYTMtj/8hoQ9OBVsARN9rCWMtjaGRUoSMtjw3bJ/4Gr7ndXQ1NB1oBwY22MNmWx4rFferqPPr7kLs6O7RicV+NdwDFq9sqsd0n6daKSadK+kxEXNO0qoAG1WptDI2MauGaTTXbJ2PPGVWClNQN7ogYlHSaJNnuUPnbo+9ocl1AQ+Z2d2moSnhbeml6rREjS/t7CWokpdFWyTmSHomI3LcfBKZDtZaHJY3/mhBGjKAdNBrcF0m6pdoM28ttD9geGB4ePvbKgAYs7e/V6mUL1NvdJUvq7e56WWiPYcQIUpf7q8tsHydpv6S3RcQTEy1bKpWCL1JA0Rau2VS1fdLb3aUtKxcVUBFQm+2tEVHKs2wjR9znS9pWL7SBVsGIEbSrRj6Ac7FqtEmAVlRtxMhf/EmP1m4c1Cdv3cEIEiQrV6vE9gmS9ko6NSJ+W295WiVoRePvSyKVj8BXL1tAeKNwU94qiYjnIuK1eUIbaFXclwTtgk9OYsbgviRoFwQ3ZgzuS4J2QXBjxmCUCdoFt3XFjMF9SdAuCG7MKNyXBO2AVgkAJIbgBoDEENwAkBiCGwASQ3ADQGIIbgBIDMENAIkhuAEgMQQ3ACSG4AaAxBDcAJAYghsAEkNwA0BiCG4ASAzBDQCJIbgBIDG5gtt2t+3bbO+2vcv2O5tdGACgurzfgPMVSfdExIW2j5N0QhNrAgBMoG5w2z5J0lmSLpOkiHhe0vPNLQsAUEueVsmpkoYlXW97u+1rbc9ucl0AgBryBPcsSadL+npE9Ev6naSV4xeyvdz2gO2B4eHhKS4TADAmT3Dvk7QvIh7MXt+mcpAfJSLWRUQpIko9PT1TWSMAoELd4I6IxyXttd2XTTpH0s+bWhUAoKa8o0o+IemmbETJryR9pHklAQAmkiu4I2KHpFKTawEA5MAnJwEgMQQ3ACSG4AaAxBDcAJAYghsAEkNwA0BiCG4ASAzBDQCJIbgBIDEENwAkhuAGgMQQ3ACQGIIbABJDcANAYghuAEgMwQ0AiSG4ASAxBDcAJIbgBoDEENwAkBiCGwASQ3ADQGJm5VnI9h5Jz0o6LOmFiCg1sygAQG25gjvzFxHxZNMqAQDkQqsEABKTN7hD0r22t9peXm0B28ttD9geGB4enroKAQBHyRvcCyPidEnnS/q47bPGLxAR6yKiFBGlnp6eKS0SAHBEruCOiP3ZzwOS7pB0RjOLAgDUVje4bc+2feLYc0nvk/SzZhcGAKguz6iS10u6w/bY8jdHxD1NrQoAUFPd4I6IX0n6s2moBQCQA8MBASAxBDcAJIbgBoDEENwAkBiCGwASQ3ADQGIIbgBIDMENAIkhuAEgMQQ3ACSG4AaAxBDcAJAYghsAEkNwA0BiCG4ASAzBDQCJyfMNOACAzIbtQ1q7cVD7R0Y1t7tLKxb3aWl/77TWQHADQE4btg9p1fqdGj10WJI0NDKqVet3StK0hjetEgDIae3GwZdCe8zoocNau3FwWutoiyPuVjh1AdD+9o+MVp0+NDKqhWs2TVsGJX/EPXbqMjQyqtCRU5cN24eKLg1Am5nb3VV1uqVpzaDkg7tVTl0AtL8Vi/vU1dlx1DRLinHLNTuDcrdKbHdIGpA0FBFLmlZRhTwtkFqnLrWmA0Be1TJo9bIFR00bKiCDGjnivlzSrmYVMl7eFkitU5da0wEgj1oZJElbVi7Sr9dcoC0rF6m3gAzKFdy250m6QNK1TatknLwtkGqnLl2dHVqxuK/pNQJoX62cQXlbJddI+pSkE2stYHu5pOWSdMoppxxzYY1cvR1/6sKoEgCNGt8WydsCGcua6cygusFte4mkAxGx1fbZtZaLiHWS1klSqVQa36tvWK1f3NjVW+nIqcvqZQu0ZeWiY90kgBmq2gdrql10lKq3QJb297bcB3AWSvqg7T2SviNpke0bm1qVWufqLYD2V60tEipnTqVWacPWDe6IWBUR8yJivqSLJG2KiEuaXdjS/l6tXrZAvd1dsqTe7q6qf/0kRpAAODa1MiSkozJo9bIFLdGGbelPTo4//Vi4ZlPV9gkjSAAci1qt2d7urpZswzb0AZyI2DxdY7irYQQJgGZILVta5og7z4dtirh6C6D9pZYtjjjmASAvUyqVYmBgIPfy46/oSuW/dq3STwKAZrO9NSJKeZZtiXuVcL8RAMivJYKb+40AQH4tEdzcbwQA8muJ4E7tii4AFKklRpWkdkUXAIrUEsEtTf9n/QEgVS3RKgEA5EdwA0BiCG4ASAzBDQCJIbgBIDEENwAkhuAGgMQQ3ACQGIIbABJDcANAYghuAEgMwQ0AiSG4ASAxBDcAJKZucNs+3vaPbT9k+2Hbn5+OwgAA1eW5H/f/SVoUEQdtd0q63/bdEfFAk2sDAFRRN7gjIiQdzF52Zo9oZlEAgNpy9bhtd9jeIemApPsi4sEqyyy3PWB7YHh4eKrrBABkcgV3RByOiNMkzZN0hu23V1lmXUSUIqLU09Mz1XUCADINjSqJiBFJmyWd15RqAAB15RlV0mO7O3veJelcSbubXRgAoLo8o0pOlnSD7Q6Vg/67EXFnc8sCANSSZ1TJTyX1T0MtAIAc+OQkACSG4AaAxBDcAJAYghsAEkNwA0BiCG4ASAzBDQCJIbgBIDEENwAkhuAGgMQQ3ACQGIIbABJDcANAYghuAEgMwQ0AiSG4ASAxBDcAJIbgBoDEENwAkBiCGwASQ3ADQGLqBrftN9j+vu1dth+2ffl0FAYAqG5WjmVekHRlRGyzfaKkrbbvi4ifN7k2AEAVdY+4I+KxiNiWPX9W0i5Jvc0uDABQXUM9btvzJfVLerAZxQAA6ssd3LZfJel2SVdExDNV5i+3PWB7YHh4eCprBABUyBXctjtVDu2bImJ9tWUiYl1ElCKi1NPTM5U1AgAq5BlVYknXSdoVEV9ufkkAgInkOeJeKOlSSYts78ge729yXQCAGuoOB4yI+yV5GmoBAOTAJycBIDEENwAkhuAGgMQQ3ACQGIIbABJDcANAYghuAEgMwQ0AiSG4ASAxBDcAJIbgBoDEENwAkBiCGwASQ3ADQGIIbgBIDMENAIkhuAEgMQQ3ACSG4AaAxNT9zkmg3W3YPqS1Gwe1f2RUc7u7tGJxn5b29xZdFlATwY0ZbcP2Ia1av1Ojhw5LkoZGRrVq/U5JIrzRsmiVYEZbu3HwpdAeM3rosNZuHCyoIqC+ukfctr8paYmkAxHx9uaXBEydem2Q/SOjVd9XazrQCvIccX9L0nlNrgOYcmNtkKGRUYWOtEE2bB96aZm53V1V31trOtAK6gZ3RPxA0m+moRZgSuVpg6xY3Keuzo6jlunq7NCKxX3TUiMwGVPW47a93PaA7YHh4eGpWi0wabXaHUMjo/qjlf+lhWs2SZJWL1ug3u4uWVJvd5dWL1vAhUm0tCkbVRIR6yStk6RSqRRTtV5gsuZ2d2moRnhXtk5WL1ugLSsXTW9xwDFgVAnaVrU2yHiMIEGKCG60jQ3bh7RwzaaabZBaGEGC1NQNbtu3SPqRpD7b+2x/tPllAY2pNYJEkrasXKRfr7lAvYwgQZvIM6rk4og4OSI6I2JeRFw3HYUBjWAECWYSPvKOtpDngzRjI0W4LwlSR3CjLdQaQTK+DbK0v5egRvK4OIm2QBsEMwlH3GgLtEEwkxDcaBu0QTBT0CoBgMQQ3ACQGIIbABJDcANAYghuAEgMwQ0AiXHE1N862/awpEencJVzJD05heubbtRfvNT3gfqLNR31vzEievIs2JTgnmq2ByKiVHQdk0X9xUt9H6i/WK1WP60SAEgMwQ0AiUkluNcVXcAxov7ipb4P1F+slqo/iR43AOCIVI64AQAZghsAEtPSwW37m7YP2P5Z0bVMhu032P6+7V22H7Z9edE1NcL28bZ/bPuhrP7PF13TZNjusL3d9p1F19Io23ts77S9w/ZA0fU0yna37dts787+H7yz6JoaYbsv+92PPZ6xfUXhdbVyj9v2WZIOSvrPiHh70fU0yvbJkk6OiG22T5S0VdLSiPh5waXlYtuSZkfEQdudku6XdHlEPFBwaQ2x/Y+SSpJOioglRdfTCNt7JJUiIskPr9i+QdIPI+Ja28dJOiEiRoquazJsd0gakvSOiJjKDxg2rKWPuCPiB5J+U3QdkxURj0XEtuz5s5J2SUrmTv9RdjB72Zk9WvcvfRW250m6QNK1Rdcy09g+SdJZkq6TpIh4PtXQzpwj6ZGiQ1tq8eBuJ7bnS+qX9GCxlTQmazPskHRA0n0RkVT9kq6R9ClJLxZdyCSFpHttb7W9vOhiGnSqpGFJ12etqmttzy66qGNwkaRbii5CIrinhe1XSbpd0hUR8UzR9TQiIg5HxGmS5kk6w3YyLSvbSyQdiIitRddyDBZGxOmSzpf08ax9mIpZkk6X9PWI6Jf0O0kriy1pcrI2zwclfa/oWiSCu+my3vDtkm6KiPVF1zNZ2SnuZknnFVxKIxZK+mDWJ/6OpEW2byy2pMZExP7s5wFJd0g6o9iKGrJP0r6Ks7TbVA7yFJ0vaVtEPFF0IRLB3VTZxb3rJO2KiC8XXU+jbPfY7s6ed0k6V9LuYqvKLyJWRcS8iJiv8mnupoi4pOCycrM9O7uorazF8D5JyYywiojHJe213ZdNOkdSEhfmq7hYLdImkVr8W95t3yLpbElzbO+T9NmIuK7YqhqyUNKlknZmfWJJuioi7iqwpkacLOmG7Gr6KyR9NyKSG1KXsNdLuqP891+zJN0cEfcUW1LDPiHppqzV8CtJHym4nobZPkHSeyX9fdG1jGnp4YAAgJejVQIAiSG4ASAxBDcAJIbgBoDEENwAkBiCGwASQ3ADQGL+H4nyr5FxHo9EAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 将features绘制到图中看看其分布情况\n",
    "plt.scatter(dataset_X[:,0],dataset_X[:,1])\n",
    "plt.title('dataset_X distribution')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 2; Error: 7.5;\n",
      "Epoch: 4; Error: 7.0;\n",
      "Epoch: 6; Error: 4.0;\n",
      "Epoch: 8; Error: 4.0;\n",
      "Epoch: 10; Error: 4.0;\n",
      "Epoch: 12; Error: 4.0;\n",
      "Epoch: 14; Error: 4.0;\n",
      "Epoch: 16; Error: 4.0;\n",
      "Epoch: 18; Error: 4.0;\n",
      "Epoch: 20; Error: 4.0;\n",
      "Epoch: 22; Error: 4.0;\n",
      "Epoch: 24; Error: 4.0;\n",
      "Epoch: 26; Error: 4.0;\n",
      "Epoch: 28; Error: 4.0;\n",
      "Epoch: 30; Error: 4.0;\n",
      "Epoch: 32; Error: 4.0;\n",
      "Epoch: 34; Error: 4.0;\n",
      "Epoch: 36; Error: 4.0;\n",
      "Epoch: 38; Error: 4.0;\n",
      "Epoch: 40; Error: 4.0;\n",
      "Epoch: 42; Error: 4.0;\n",
      "Epoch: 44; Error: 4.0;\n",
      "Epoch: 46; Error: 4.0;\n",
      "Epoch: 48; Error: 4.0;\n",
      "Epoch: 50; Error: 4.0;\n",
      "The maximum number of train epochs is reached\n"
     ]
    }
   ],
   "source": [
    "# 构建单层NN模型，该模型的隐含层含有两个感知器\n",
    "import neurolab as nl\n",
    "x_min, x_max = dataset_X[:,0].min(), dataset_X[:,0].max()\n",
    "y_min, y_max = dataset_X[:,1].min(), dataset_X[:,1].max()\n",
    "single_layer_net = nl.net.newp([[x_min, x_max], [y_min, y_max]], 2) # 隐含层含有两个神经元\n",
    "# 所以本单层NN模型含有两个输入神经元，两个隐含层神经元，两个输出神经元\n",
    "cost = single_layer_net.train(dataset_X, dataset_y, epochs=50, show=2, lr=0.01)\n",
    "# 训练该单层NN模型，50个回合，每2个回合显示一下训练结果，学习速率为0.01"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5,1,'Training cost progress')"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(cost)\n",
    "plt.xlabel('Number of epochs')\n",
    "plt.ylabel('Training cost')\n",
    "plt.grid()\n",
    "plt.title('Training cost progress')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 0.]\n",
      " [1. 0.]\n",
      " [1. 1.]]\n"
     ]
    }
   ],
   "source": [
    "# 用训练好的模型来预测新样本\n",
    "new_samples=np.array([[0.3, 4.5],\n",
    "                      [4.5, 0.5],\n",
    "                      [4.3, 8]])\n",
    "print(single_layer_net.sim(new_samples))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
